#include <iostream>
#include <vector>
#include <ranges>
#include <iomanip>

using namespace std;

void f1() {
vector<int> vec{0, 1, 2, 3, 4};  // 用vector作为一个range
auto even = [](int i) { return i % 2 == 0; };  // 过滤出其中的所有偶数
for (int i : vec | views::filter(even)) {  // 管道符形式
    printf("%d ", i);
}
for (int i : views::filter(vec, even)) {  // 函数形式
    printf("%d ", i);
}
for (int i : ranges::filter_view(vec, even)) {  // 函数形式
    printf("%d ", i);
}

auto v = vec | views::filter(even);
vector<int> b(v.begin(), v.end());  // 用view的迭代器来构造一个新的vector
}

void f2() {
string str{"Hello"};  // 用string作为一个range
auto to_upper = [](char c) { return toupper(c); };  // 将每个元素都转为大写
for (char c : str | views::transform(to_upper)) {  // 管道符形式
    printf("%c", c);
}
for (char c : views::transform(str, to_upper)) {  // 函数形式
    printf("%c", c);
}
for (char c : ranges::transform_view(str, to_upper)) {  // 函数形式
    printf("%c", c);
}

auto v = str | views::transform(to_upper);
string s(v.begin(), v.end());  // 用view的迭代器来构造一个新的string
}

void f3() {
    vector<string> vecstr = {"hello", "world"};
    for (char c : vecstr | views::join) {
        printf("%c", c);
    }
    for (char c : views::join(vecstr)) {
        printf("%c", c);
    }
    for (char c : ranges::join_view(vecstr)) {
        printf("%c", c);
    }
    auto v = vecstr | views::join;
    string s(v.begin(), v.end());
    printf("%s", s.c_str());
}

int main() {
    f1();
    printf("\n");
    f2();
    printf("\n");
    f3();
    printf("\n");

vector<int> v1 = {0, 1, 2, 3, 4};
vector<int> v2;
for (auto i : v1) {
    if (i % 2 == 0) {
        v2.push_back(i * i);
    }
}
vector<int> v3(v2.rbegin(), v2.rend());

for (int i : v1 | views::filter([](int i) { return i % 2 == 0; })
                | views::transform([](int i) { return i * i; })
                | views::reverse) {
    printf("%d ", i);
}
    string s;
}